package cn.tedu.submarine;

import java.util.Random;
import javax.swing.ImageIcon;
import java.awt.Graphics;//导入画笔


/** 海洋对象 */
public abstract class SeaObject {
    //活着的
    public static final int LIVE = 0;
    //死了的
    public static final int DEAD = 1;
    private int state = LIVE;//当前状态 默认活着的

    private int width;  //宽      //暂时搁置，因为getter/setter还没有讲，
    private int height; //高      //面向对象最后一天讲getter/setter之后，再修改这个地方
    private int x;      //x坐标
    private int y;      //y坐标
    private int speed;  //移动速度

    public void setState(int state) {
        this.state = state;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public static int getLIVE() {
        return LIVE;
    }

    public static int getDEAD() {
        return DEAD;
    }

    public int getState() {
        return state;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public int getSpeed() {
        return speed;
    }

    /** 专门给侦察潜艇、鱼雷潜艇、水雷潜艇提供的 */
    //三种潜艇的width/height是不一样的，所以数据不能写死，需传参写活
    //三种潜艇的x/y/speed是一样的，所以数据可以写死，不需要传参
    public SeaObject(int width,int height){
        this.width = width;
        this.height = height;
        x = -width; //负的潜艇的宽
        Random rand = new Random(); //随机数对象
        y = rand.nextInt(World.HEIGHT-height-150+1)+150; //150到(窗口高-潜艇高)的随机数
        speed = rand.nextInt(3)+1; //1到3的随机数
    }

    /** 专门给战舰、水雷、炸弹提供的 */
    //战舰/水雷/炸弹的width/height/x/y/speed都是不一样的，所以数据不能写死，需传参写活
    public SeaObject(int width,int height,int x,int y,int speed){
        this.width = width;
        this.height = height;
        this.x = x;
        this.y = y;
        this.speed = speed;
    }

    /** 移动 */
    public abstract void move();

    //判断是否活着的
    public boolean isLive(){
        return state == LIVE;//若state为LIVE 表示活着的 返回true 否则返回false
    }

    //判断是否死了的
    public boolean isDead(){
        return state == DEAD; //若state为DEAD 表示死了的 返回true 否则返回false
    }

    //获取对象的图片
    public abstract ImageIcon getImage();

    /** 画对象 g：画笔*/
    public void paintImage(Graphics g){
        if (this.isLive()){
            this.getImage().paintIcon(null,g,this.x,this.y);
        }
    }


    /** 检测潜艇越界 */
    public boolean isOutOfBounds(){
        return this.x>=World.WIDTH;//潜艇的x>=窗口的宽 即为越界了
    }

    /** 检测碰撞 this：一个对象   other：另一个对象 */
    public boolean isHit(SeaObject other){
        //假设this为潜艇 other为炸弹
        int x1 = this.x - other.width;      //x1:潜艇的x-炸弹的宽
        int x2 = this.x + this.width;       //x2：潜艇的x+潜艇的宽
        int y1 = this.y - other.height;     //y1：潜艇的y-炸弹的高
        int y2 = this.y + this.height;      //y2：潜艇的y+潜艇的高
        int x = other.x; //x：炸弹的x
        int y = other.y; //y：炸弹的y
        return x>=x1 && x<=x2 && y>=y1 && y<=y2;//x在x1与x2之间 并且 y在y1与y2之间
    }

    /** 海洋对象去死 */
    public void goDead(){
        state = DEAD; //将当前状态修改为DEAD死了的
    }


    //抽象类是不完整的 不能被实例
    //jvm内存分配是在运行时分配的，而static final常量是在编译时就变了数 不用分配内存

}



















